'''
pip install playWright
playWright install
playWright 浏览器工具包
他可以用于与浏览器进行交互，允许代理浏览器与动态渲染的网站进行交互。
主要包括：
    NavigateTool（navigate_browser）- 导航到指定的 URL
    NavigateBackTool（previous_page）- 等待元素出现
    ClickTool（click_element）- 单击指定选择器的元素
    ExtractTextTool（extract_text）- 使用 BeautifulSoup 从当前网页中提取文本
    ExtractHyperlinksTool（extract_hyperlinks）- 使用 BeautifulSoup 从当前网页中提取超链接
    GetElementsTool（get_elements）- 使用 CSS 选择器选择元素
    CurrentPageTool（current_page）- 获取当前页面的 URL
'''

#from langchain.agents.agent_toolkits import PlayWrightBrowserToolkit
# 导入playwright 工具包
from langchain_community.agent_toolkits.playwright.toolkit import PlayWrightBrowserToolkit
# 导入playwright创建浏览器的类
from langchain_community.tools.playwright.utils import (
    create_async_playwright_browser,
    create_sync_playwright_browser,  # A synchronous browser is available, though it isn't compatible with jupyter.
)

# playwright.chromium.launch(executablePath='C:/Users/zdp/AppData/Local/Google/Chrome/Application')
# 注意创建浏览器
# 注意在pip安装了playwright之后，还需要执行playwright install，它会加载浏览器内核
# 这样才能成功创建浏览器
async_browser = create_async_playwright_browser()
toolkit = PlayWrightBrowserToolkit.from_browser(async_browser=async_browser)
tools = toolkit.get_tools()
print(tools)

# 对浏览器工具的了解
tools_by_name = {tool.name: tool for tool in tools}
navigate_tool = tools_by_name["navigate_browser"]
get_elements_tool = tools_by_name["get_elements"]
print(navigate_tool)
print(get_elements_tool)

import asyncio

# Python中的await关键字用于在async函数中暂停执行，等待一个异步操作完成。
async def my_async_function():
    result = await navigate_tool.arun(
        {"url": "https://zhuanlan.zhihu.com/p/676442200"}
    )
    # The browser is shared across tools, so the agent can interact in a stateful manner
    result01 = await get_elements_tool.arun(
        {"selector": ".Post-content", "attributes": ["data-zop"]}
    )
    print(result)
    print(result01)
    return result

# 在Python中调用异步函数，你需要使用asyncio库。
# 要调用异步函数，你需要使用await关键字，
# 这只能在异步函数中或者使用asyncio的事件循环中

# 获取事件循环,这里通过get_event_loop()方法获取到当前event loop，
# 如果当前是主线程，且set_event_loop()没有调用，
# 则该方法会创建一个event loop并设置为当前event loop
loop = asyncio.get_event_loop()
# 运行异步函数，执行异步函数直至函数运行结束
loop.run_until_complete(my_async_function())

# 方式二直接调用协程代码
# print("方式二直接调用协程代码")
# asyncio.run(my_async_function())
